package com.liming.product.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.liming.common.pojo.dto.product.AddProductDTO;
import com.liming.common.pojo.dto.product.MiniProductPageQuery;
import com.liming.common.pojo.dto.product.ProductPageQuery;
import com.liming.common.pojo.dto.product.UpdateProductDTO;
import com.liming.common.pojo.dto.stock.StockPageQuery;
import com.liming.common.pojo.entity.product.Product;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.product.ProductPriceVO;
import com.liming.common.pojo.vo.product.openfeign.FeignMiniProductDetailVO;
import com.liming.common.pojo.vo.product.openfeign.FeignMiniProductVO;
import com.liming.common.pojo.vo.product.openfeign.FeignProductVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * @author liming
 * @date 2025/1/16
 */
public interface ProductMircoService extends IService<Product> {

    /**
     * 查询商品分页
     *
     * @return 商品分页
     */
    PageVO<FeignProductVO> page(ProductPageQuery productPageQuery);

    /**
     * 根据商品ID查询商品信息
     *
     * @param id 商品ID
     * @return 商品信息
     */
    FeignProductVO get(Long id);

    /**
     * 根据商品名称模糊查询商品ID
     *
     * @param name 商品名称
     * @return 商品ID列表
     */
    Map<Long, Product> idProductMapByLikeName(String name);

    /**
     * 根据商品ID查询商品信息
     *
     * @param ids 商品ID列表
     * @return 商品信息列表
     */
    List<FeignProductVO> listProductByIds(List<Long> ids);

    /**
     * 根据商品IDS 查询商品价格Map
     *
     * @param productIds 商品IDS
     * @return Map<商品ID, 商品价格>
     */
    Map<Long, Integer> idAndPriceMap(List<Long> productIds);

    /**
     * 新增商品
     *
     * @param addProductDTO 新增商品信息
     * @return 新增是否成功
     */
    Boolean add(AddProductDTO addProductDTO);

    /**
     * 根据excel批量导入商品
     *
     * @param file excel文件
     * @return 是否导入成功
     */
    Boolean importProduct(MultipartFile file);

    /**
     * 更新商品
     *
     * @param updateProductDTO 更新商品信息
     * @return 更新是否成功
     */
    Boolean updateProduct(UpdateProductDTO updateProductDTO);

    /**
     * 更新商品上架状态
     *
     * @param id 商品ID
     * @return 更新是否成功
     */
    Boolean updateOnShelf(Long id);

    /**
     * 查询商品 售价 原价
     *
     * @param id 商品ID
     * @return 商品价格（售价 - 原价）
     */
    ProductPriceVO getPrice(Long id);

    /**
     * 根据库存查询参数查询商品IDS
     *
     * @param query 库存查询参数
     * @return 商品IDS
     */
    List<Long> productIdsByStockQuery(StockPageQuery query);

    /**
     * 滞销商品数量
     *
     * @return 数量
     */
    List<FeignProductVO> stagnantProductCount();

    /**
     * 推荐商品
     *
     * @return 商品信息列表
     */
    List<FeignMiniProductVO> recommendProduct();

    /**
     * 商品详情 - 小程序
     *
     * @param id 商品id
     * @return 商品详情
     */
    FeignMiniProductDetailVO miniDetail(Long id);

    /**
     * 商品分页 - 小程序
     *
     * @param query 商品分页查询参数
     * @return 商品分页
     */
    PageVO<FeignMiniProductVO> miniPage(MiniProductPageQuery query);

    /**
     * 根据商品ID查询品牌和分类ID
     *
     * @param keyIdList 商品ID列表
     * @return Map
     */
    Map<Integer, List<Long>> brandAndCategoryIdsMapByProductIds(List<Long> keyIdList);

    /**
     * 增加商品销售数量
     *
     * @param productIdAndQuantity Map<商品ID，商品销售数量>
     * @return 是否增加成功
     */
    Boolean increaseSalesByMap(Map<Long, Integer> productIdAndQuantity);

    /**
     * 更新商品销售时间
     *
     * @param productIds 商品ID列表
     */
    void updateSalesTimeByIds(List<Long> productIds);
}
